package com.google.code.gronono.commons;

import java.util.List;
import java.util.Map;

/**
 * Classe utilitaire contenant des méthodes de transtypage.
 * @author Arnaud BRUNET
 */
public class CastUtils {
	/**
	 * La classe est une classe utilitaire.
	 * Son constructeur ne doit jamais être appelé.
	 * @throws UnsupportedOperationException Toujours.
	 */
	private CastUtils() {
		throw new UnsupportedOperationException();
	}

	/**
	 * Transtype une liste non paramétrée en son équivalent paramétrée.
	 * @param <T> Le paramètre de la nouvelle liste.
	 * @param list La liste non paramétrée.
	 * @return La liste paramétrée.
	 * @throws ClassCastException Si la liste non paramétrée ne contient pas que des éléments de type <code>T</code>.
	 */
	@SuppressWarnings("unchecked")
	public static <T> List<T> uncheckedCastList(final List<?> list) {
		return (List<T>) list;
	}

	/**
	 * Transtype une Map non paramétrée en son équivalent paramétrée.
	 * @param <U> Le paramètre des clés de la nouvelle Map.
	 * @param <V> Le paramètre des valeurs de la nouvelle Map.
	 * @param map La Map non paramétrée.
	 * @return La Map paramétrée.
	 * @throws ClassCastException Si la Map non paramétrée ne contient pas que des éléments de type <code>&lt;U, V&gt;</code>.
	 */
	@SuppressWarnings("unchecked")
	public static <U, V> Map<U, V> uncheckedCastMap(final Map<?, ?> map) {
		return (Map<U, V>) map;
	}

	/**
	 * Transtype une classe non paramétrée en son équivalent paramétrée.
	 * @param <T> Le paramètre de la nouvelle classe.
	 * @param clazz La classe non paramétrée.
	 * @return La classe paramétrée.
	 */
	@SuppressWarnings("unchecked")
	public static <T> Class<T> uncheckedCastClass(final Class<?> clazz) {
		return (Class<T>) clazz;
	}

	/**
	 * Transtype un objet en T.
	 * @param <T> Le type de l'objet.
	 * @param object L'objet à transtyper.
	 * @return Le même objet mais transtypé.
	 */
	@SuppressWarnings("unchecked")
	public static <T> T uncheckedCastObject(final Object object) {
		return (T) object;
	}

}
